#include<stdio.h>
#include<string.h>
#include<math.h>
#include <stdlib.h>


float determinante(float a[][5]);

int  main()
{
     int i=0,j=0;
     // Matrices

     float matriz[5][5]={{-1,0,2,1,0},{3,-1,5,1,2},{0,1,-2,0,9},{1,3,6,4,3},{2,-2,1,-3,2}};
     float matriz_aux[5][5]={{-1,0,2,1,0},{3,-1,5,1,2},{0,1,-2,0,9},{1,3,6,4,3},{2,-2,1,-3,2}};
//     float a[5][5],matriz_aux[5][5];
     // Vectores
     float resultados[5]={1,2,3,4,5},vector_aux[5]={0,0,0,0,0};
     //Valores
     float determinantes[6]={0,0,0,0,0,0};

     printf("\n\t\t\t  METODO DE CRAMER");
     printf("\n\n\nSolucion de un sistema de 5x5 ");

     printf("\n Ingrese los coeficientes\n");
		/* Datos para iniciar metodo */
	for(i=0;i<5;i++)                              //Pedir datos
	{
			printf("\n Fila %d \n",i);
	    for(j=0;j<5;j++)
	    {
				printf(" Ingrese a(%d,%d) = ",i,j);
				scanf("%f",&matriz[i][j]);
				matriz_aux[i][j]=matriz[i][j];
	    }
	    printf(" Ingrese el resultado de la ecuacion(%d)= ",i);
	    scanf("%f",&resultados[i]);


	}

	printf("\n");
	printf("\n");



     determinantes[0]=determinante(matriz);
     for (i=0; i<5;i++)
     {
	 for(j=0;j<5;j++)
	 {

	  vector_aux[j]=matriz[j][i];
	  matriz_aux[j][i]=resultados[j];

	 }
	 determinantes[i+1]=determinante(matriz_aux);
	 for(j=0;j<5;j++)
	 {
	  matriz_aux[j][i]=vector_aux[j];
	 }
     }



     if(resultados[0]==0 && resultados[1]==0 && resultados[2]==0 &&
	resultados[3]==0 && resultados[4]==0 && resultados[5]==0 && determinantes[0]==0)
	  printf("\n Soluciones infinitas\n ");
     else if(determinantes[0]!=0)
	  printf("\n x1=%lf\n x2=%lf\n x3=%lf\n x4=%1f\n x5=%1f\n", (determinantes[1]/determinantes[0]), (determinantes[2]/determinantes[0]), (determinantes[3]/determinantes[0]),(determinantes[4]/determinantes[0]),(determinantes[5]/determinantes[0]));
     else if(determinantes[1]==0 && determinantes[1]==0 && determinantes[2]==0 && determinantes[3]==0 && determinantes[4]==0 && determinantes[5]==0)
	  printf("\n Infinite Solutions\n ");
     else
	  printf("No Solution\n ");




 return(0);

}

float determinante(float m[5][5])
{
  int i,j,k;
  float mult;
  float deter=1;
  float a[5][5];

  for (i=0;i<5;i++)
  {
   for (j=0;j<5;j++)
   {
    a[i][j]=m[i][j];
   }

  }

  for(i=0;i<5;i++)
  {
	for(j=0;j<5;j++)
	{
	  mult=a[j][i]/a[i][i];
	  for(k=0;k<5;k++)
	  {
		if(i==j) break;
		a[j][k]=a[j][k]-a[i][k]*mult;
	  }
	}
  }
  for(i=0;i<5;i++)
  {
	deter=deter*a[i][i];
  }
  return(deter);
}

/*

float determinante(float a[][5],float n )
{
    int  i, j, j1, j2;
    float  d = 0;
    float m[4][4] = {{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};

    if (n == 2)                                // terminate recursion
    {
	d = a[0][0]*a[1][1] - a[1][0]*a[0][1];
    }
    else
    {
	d = 0;
	for (j1 = 0; j1 < n; j1++ )            // do each column
	{
	    for (i = 1; i < n; i++)            // create minor
	    {
		j2 = 0;
		for (j = 0; j < n; j++)
		{
		    if (j == j1) continue;
                    m[i-1][j2] = a[i][j];
                    j2++;
                }
            }
            
            // sum (+/-)cofactor * minor  
            d = d + pow(-1.0, j1)*a[0][j1]*determinante( m, n-1 );
        }
    }

    return d;
}


*/


/*
double det(float **m, int b){
	float determinante = 0, aux = 0;
	int c;
	if(b==2)
		return m[0][0]*m[1][1] - m[1][0]*m[0][1];
	else{
		for(int j=0; j<b; j++){
			float **menor = (float **)malloc(sizeof(float)*(b-1));
			for(int h=0; h<(b-1); h++) menor[h] = (float *)malloc(sizeof(float)*(b-1));
			for(int k=1; k<b; k++){
				c = 0;
				for(int l=0; l<b; l++){
					if(l!=j){
						menor[k-1][c] = m[k][l];
						c++;
					}
				}
			}
			aux = pow(-1, 2+j)*m[0][j]*det(menor, b-1);
			determinante += aux;
			for(int q = 0; q<(b-1); q++)
				free(menor[q]);
			free(menor);
		}
		return determinante;
	}
}*/


